Added helper functions, moved course calc from garmin_txt
authorparkrrrr <parkrrrr@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Fri, 7 Apr 2006 14:41:26 +0000 (14:41 +0000)
committerparkrrrr <parkrrrr@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Fri, 7 Apr 2006 14:41:26 +0000 (14:41 +0000)
gpsbabel/grtcirc.c
gpsbabel/grtcirc.h

index 0a686bfc6c9b2d794fffa2a1bddc0f3eda42c0c4..d2cd3a7fc43f8f6299261719064558e06546185b 100644 (file)
@@ -22,6 +22,8 @@
 #include <stdio.h>
 #include "defs.h"
 
+static const double EARTH_RAD = 6378137.0;
+
 static void crossproduct( double x1, double y1, double z1, 
                   double x2, double y2, double z2,
                   double *xa, double *ya, double *za ) {
@@ -47,10 +49,14 @@ static double dotproduct( double x1, double y1, double z1,
  */
 
 double radtomiles( double rads ) {
-    const double radmiles = 6378137.0*100.0/2.54/12.0/5280.0;
+    const double radmiles = EARTH_RAD*100.0/2.54/12.0/5280.0;
     return (rads*radmiles);
 }
 
+double radtometers( double rads ) {
+    return ( rads * EARTH_RAD );
+}
+
 double gcdist( double lat1, double lon1, double lat2, double lon2 ) {
   double res;
   res = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2));
@@ -60,6 +66,19 @@ double gcdist( double lat1, double lon1, double lat2, double lon2 ) {
   }
   return res;
 }
+
+/* This value is the heading you'd leave point 1 at to arrive at point 2. */
+double heading( double lat1, double lon1, double lat2, double lon2 ) {
+  double v1, v2;
+  v1 = sin(lon1 - lon2) * cos(lat2);
+  v2 = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon1 - lon2);
+  /* rounding error protection */
+  if (fabs(v1) < 1e-15) v1 = 0.0;
+  if (fabs(v2) < 1e-15) v2 = 0.0;     
+  return atan2(v1, v2);
+}
+
+       
  
 double linedist(double lat1, double lon1,
                double lat2, double lon2,
index ddd37401b6b0a277e38b9af45ffbfec0eb76bf1c..1fb749e40d434e0a14f0d272f07912e05e7e128c 100644 (file)
 
  */
 double gcdist( double lat1, double lon1, double lat2, double lon2 );
+double heading( double lat1, double lon1, double lat2, double lon2 );
 
 double linedist(double lat1, double lon1,
                double lat2, double lon2,
                double lat3, double lon3 );
 
+double radtometers( double rads );
 double radtomiles( double rads );
 
 void linepart(double lat1, double lon1,
                double lat2, double lon2,
                double frac,
                double *reslat, double *reslon ); 
-       
+
+
+#define DEG(x) ((x)*180.0/M_PI)
+#define RAD(x) ((x)*M_PI/180.0)